Матч 353, Словарь (Glossary)

Дивизион 2, Уровень 2; Дивизион 1, Уровень 1

 

Словарь состоит из списка терминов в алфавитном порядке. По заданному набору терминов необходимо построить словарь согласно следующим правилам. Для каждой буквы от ‘A’ до ‘Z’, для которой есть начинающийся с нее термин, следует создать блок, состоящий из следующих строк:

1. Первая строка содержит букву в верхнем регистре.

2. Вторая строка содержит 19 символов ‘-‘.

3. Далее располагаются термины, начинающиеся с текущей буквы в алфавитном порядке без учета регистра. Каждому термину должны предшествовать два пробела.

4. Добавить к каждой строке справа пробелы так, чтобы длина каждой строки равнялась 19 символам.

Блоки букв сортируем в алфавитном порядке и разбиваем на две колонки. Левая колонка содержит блоки для букв от ‘A’ до ‘M’, правая – блоки для букв от ‘N’ до ‘Z’. Ширина каждой колонки составляет 19 символов, колонки разделяют два пробела.

 

Класс: Glossary

Метод: vector<string> buildGlossary(vector<string> items)

Ограничения: -100 £ x1, y1, x2, y2 £ 100, 1 £ d £ 200.

 

Вход. Координаты фокусов (x1, y1), (x2, y2) и сумма расстояний от точек эллипса до фокусов d.

 

Выход. Количество точек с целочисленными координатами, лежащих строго внутри эллипса.

 

Пример входа

items

{"Canada", "France", "Germany", "Italy", "Japan", "Russia",

"United Kingdom", "United States"}

{"alpha", "beta", "gamma", "delta", "omega"}

{"AVL tree", "backtracking", "array", "balanced tree", "binary search"}

 

Пример выхода

{"C                    R                  ",

 "-------------------  -------------------",

 "  Canada               Russia           ",

 "F                    U                  ",

 "-------------------  -------------------",

 "  France               United Kingdom   ",

 "G                      United States    ",

 "-------------------                     ",

 "  Germany                               ",

 "I                                       ",

 "-------------------                     ",

 "  Italy                                 ",

 "J                                       ",

 "-------------------                     ",

 "  Japan                                 " }

{"A                    O                  ",

 "-------------------  -------------------",

 "  alpha                omega            ",

 "B                                       ",

 "-------------------                     ",

 "  beta                                  ",

 "D                                       ",

 "-------------------                     ",

 "  delta                                 ",

 "G                                       ",

 "-------------------                     ",

 "  gamma                                 " }

{"A                                       ",

 "-------------------                     ",

 "  array                                 ",

 "  AVL tree                              ",

 "B                                       ",

 "-------------------                     ",

 "  backtracking                          ",

 "  balanced tree                         ",

 "  binary search                         " }

 

 

РЕШЕНИЕ

обработка строк

 

Отсортируем термины в массиве items в алфавитном порядке без учета регистра, используя функцию сравнения cmp. Проходим по словам, формируем требуемые блоки строк для каждой буквы. Для букв ‘A’ – ‘M’ требуемые строки заносим в массив col[0], для букв ‘N’ – ‘Z’ – в массив col[1]. Выравниваем массивы col[0] и col[1] по количеству элементов, после чего сливаем их так, чтобы образовалось две колонки.

 

ПРОГРАММА

 

#include <cstdio>

#include <string>

#include <vector>

#include <algorithm>

using namespace std;

 

string add(string s, int size)

{

  return s + string(size - s.size(),' ');

}

 

int cmp(string a, string b)

{

  int i;

  for(i = 0; i < a.size(); i++) a[i] = tolower(a[i]);

  for(i = 0; i < b.size(); i++) b[i] = tolower(b[i]);

  return a < b;

}

 

class Glossary

{

public:

  vector<string> buildGlossary(vector<string> items)

  {

    vector<string> col[2];

    int pos = 0, i;

    char c, last = ' ';

    sort(items.begin(),items.end(),cmp);

    for(i = 0; i < items.size(); i++)

    {

      c = toupper(items[i][0]);

      if(c != last)

      {

        pos = (c >= 'N');

        col[pos].push_back(add(string(1,c),19));

        col[pos].push_back(string(19,'-'));

        last = c;

      }

      col[pos].push_back(add("  "+items[i],19));

    }

    while (col[0].size() < col[1].size()) col[0].push_back(string(19, ' '));

    while (col[1].size() < col[0].size()) col[1].push_back(string(19, ' '));

    for (i = 0; i < col[0].size(); i++)

      col[0][i] = col[0][i] + "  " + col[1][i];

    return col[0];

  }

};